package com.ym.core.domain;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.ym.common.constant.Coder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回的参数封装类
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
@ApiModel(description = "通用响应返回对象")
public class APIResponse<T> {

	private static final Coder.System SUCCESS = Coder.System.SUCCESS;

	private static final Coder.System ERROR = Coder.System.FAIL;

	@ApiModelProperty(value = "结果代码, 0失败,1成功", position = 0)
	private String code;

	@ApiModelProperty(value = "操作信息", position = 1)
	private String msg;

	@ApiModelProperty(value = "结果数据", position = 2)
	private Object data;

	@ApiModelProperty(value = "时间戳", position = 3)
	private String time = DateUtil.now();

	private APIResponse() {

	}

	/**
	 * 初始化一个新创建的 AjaxResult 对象
	 *
	 * @param msg  消息
	 * @param data 数据对象
	 */
	public <T> APIResponse(String code, String msg, T data) {
		this.code = code;
		this.msg = msg;
		if (ObjectUtil.isNotNull(data)) {
			this.data = data;
		}
	}

	/**
	 * 自定义put数据
	 *
	 * @param key
	 * @param obj
	 * @return
	 */
	public <T> APIResponse<T> put(String key, Object obj) {
		if (this.data == null) {
			this.data = new HashMap<String, Object>();
		} else if (!(this.data instanceof Map)) {
			throw new UnsupportedOperationException("不支持设置data后put数据");
		}
		((Map<String, Object>) data).put(key, obj);
		return (APIResponse<T>) this;
	}

	/**
	 * 返回成功消息
	 *
	 * @return 成功消息
	 */
	public static <T> APIResponse<T> success() {
		return new APIResponse<T>(SUCCESS.getCode(), SUCCESS.getMsg(), null);
	}

	/**
	 * 返回成功数据
	 *
	 * @param data
	 * @return 成功消息
	 */
	public static <T> APIResponse<T> success(Object data) {
		return new APIResponse<T>(SUCCESS.getCode(), SUCCESS.getMsg(), data);
	}
	/**
	 * 返回成功数据
	 *
	 * @param msg
	 * @return 成功消息
	 */
	public static <T> APIResponse<T> successWithNoData(String msg) {
		return new APIResponse<T>(SUCCESS.getCode(),msg,null);
	}

	/**
	 * 返回成功数据
	 *
	 * @return 成功消息
	 */
	public static <T> APIResponse<T> success(String msg, T data) {
		return new APIResponse<T>(SUCCESS.getCode(), msg, data);
	}

	/**
	 * 返回错误消息
	 *
	 * @return
	 */
	public static <T> APIResponse<T> fail() {
		return new APIResponse<T>(ERROR.getCode(), ERROR.getMsg(), null);
	}

	/**
	 * 返回错误消息
	 *
	 * @return
	 */
	public static <T> APIResponse<T> fail(String msg) {
		return new APIResponse<T>(ERROR.getCode(), msg, null);
	}

	/**
	 * 返回错误消息
	 *
	 * @param data 返回内容
	 * @return 警告消息
	 */
	public static <T> APIResponse<T> failData(Object data) {
		return new APIResponse<T>(ERROR.getCode(), ERROR.getMsg(), data);
	}

	/**
	 * 返回错误消息
	 *
	 * @param coder 状态码
	 * @return 警告消息
	 */
	public static <T> APIResponse<T> fail(Coder coder) {
		return new APIResponse<T>(coder.getCode(), coder.getMsg(), null);
	}


	/**
	 * 返回错误消息
	 *
	 * @param coder code
	 * @param data  数据对象
	 * @return 警告消息
	 */
	public static <T> APIResponse<T> fail(Coder coder, Object data) {
		return new APIResponse<T>(coder.getCode(), coder.getMsg(), data);
	}

	/**
	 * 返回错误消息
	 *
	 * @param msg  消息
	 * @param data 数据对象
	 * @return 警告消息
	 */
	public static <T> APIResponse<T> fail(String msg, Object data) {
		return new APIResponse<T>(ERROR.getCode(), msg, data);
	}

	public String getCode() {
		return code;
	}

	public String getMsg() {
		return msg;
	}

	public Object getData() {
		return data;
	}

	public String getTime() {
		return time;
	}
	
}
